package wxapp

import (
	"errors"
	"strings"
	. "wxsdk/wxpay"
	"github.com/sbabiv/xml2map"
)

// 微信代金券
type WXPayCoupon struct {
	CouponId   string // 代金券id
	CouponType string // 代金券类型
	CouponFee  string // 代金券金额
}

// 回调
type NotifyResponse struct {
	BaseResponse `xml:",innerXml,omitempty"`
	OpenId             string `xml:"openid"`                         // 用户标识
	IsSubscribe        string `xml:"is_subscribe,omitempty"`         // 是否关注公众账号
	SubOpenid          string `xml:"sub_openid,omitempty"`           // 用户子标识(服务商特有参数)
	SubIsSubscribe     string `xml:"sub_is_subscribe,omitempty"`     // 是否关注子公众账号(服务商特有参数)
	TradeType          string `xml:"trade_type"`                     // 交易类型
	BankType           string `xml:"bank_type"`                      // 付款银行
	TotalFee           string `xml:"total_fee"`                      // 总金额
	SettlementTotalFee string `xml:"settlement_total_fee,omitempty"` // 应结订单金额
	FeeType            string `xml:"fee_type,omitempty"`             // 货币种类
	CashFee            string `xml:"cash_fee,omitempty"`             // 现金支付金额
	CashFeeType        string `xml:"cash_fee_type,omitempty"`        // 现金支付货币类型
	CouponFee          string `xml:"coupon_fee,omitempty"`           // 代金券或立减优惠金额
	CouponCount        string `xml:"coupon_count,omitempty"`         // 代金券或立减优惠使用数量
	/*
	CouponTypeN        string `xml:"coupon_type_$n,omitempty"`       //代金券类型
	CouponIdN          string `xml:"coupon_id_$n,omitempty"`         //代金券ID
	CouponFeeN         string `xml:"coupon_fee_$n,omitempty"`        //单个代金券支付金额
	*/
	CouponRefunds      []WXPayCoupon
	TransactionId      string `xml:"transaction_id"`                 // 微信支付订单号
	OutTradeNo         string `xml:"out_trade_no"`                   // 商户订单号
	Attach             string `xml:"attach"`                         // 商家数据包，原样返回
	TimeEnd            string `xml:"time_end"`                       // 支付完成时间
}

func PayNotify(body []byte) (map[string]interface{}, error){

	decoder := xml2map.NewDecoder(strings.NewReader(string(body)))
	result, err := decoder.Decode()
	if err != nil {
	   return map[string]interface{}{}, err
	}
	rspMap :=  result["xml"].(map[string]interface{})
	if rspMap["return_code"] != "SUCCESS" {
	    returnMsg := rspMap["return_msg"].(string)
		return map[string]interface{}{}, errors.New(returnMsg)
	}
	return rspMap, nil
}

/*
func (self *WXPayRefundResponse) Parse(params WXPayParams) {
	params.toStruct(reflect.ValueOf(self))

	// 处理代金券
	count, _ := strconv.Atoi(self.CouponRefundCount)
	coupons := make([]WXPayCoupon, count)
	for i := 0; i < count; i++ {
		coupons[i] = WXPayCoupon{
			CouponId:   params["coupon_id_"+strconv.Itoa(i)],
			CouponType: params["coupon_type_"+strconv.Itoa(i)],
			CouponFee:  params["coupon_fee_"+strconv.Itoa(i)],
		}
	}
	self.CouponRefunds = coupons
}

*/